package preprocessor.absorption;

/**
 * For every absorption that implements this interface, it should follow the guidelines:
 * 1. input: a single axiom
 * 2. output: boolean val.
 * true if fully absorbed, false otherwise.
 * 3. a single axiom may be fully absorbed, leaving no GCIs. 
 * Otherwise, the remaining part will be GCIs, sending back to the Tbox.
 * 4. Pipeline the absorptions? tbd.
 * @author j55wu
 *
 */
public interface Absorption {

	//this refers to standard unary absorption
	public final static boolean CA = true;
	
	//this refers to negated unary absorption
	public final static boolean NCA = true;
	
	//this refers to binary absorption
	public final static boolean BA = true;
	
	//this refers to domain/range or inverse-role-based absorption
	//EX R.A => B   is the same as A => ALL R-.B
	//for future extension only, since no inverse role supported yet.
	public final static boolean IRA = false;
	
	/**
	 * When <b>IRA</b> is used, Role Absorption is turned off, otherwise on.<br>
	 * 1. EX R.A => B is absorbed as the domain of R: B or (ALL R.~A)<br>
	 * 2. B => ALL R.A is absorbed as the domain of R: ~B or (ALL R.A)
	 */
	public final static boolean RA = !IRA;
	
	//this refers to the enhanced unary absorption: A=>B, ~A=>C, then add a gci T => B or C
	public final static boolean ECA = false;
	
	// if true, A=C becomes A => C and  not A => not C. This requires NCA true.
	public final static boolean EQA = true && NCA;
	
	//an absorption returns true iff the given axiom is absorbed and no new gci generated.
	//boolean absorb();
}
